package 反射注解封装自动测试框架;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.lang.reflect.Method;

/**
 * 功能描述：
 * 测试框架类，此类一旦运行就能够检测出我们指定的程序是否存在bug
 * <p>
 * 实现步骤：
 * 1.获取所有方法
 * 2.判断是否加了注解进行bug的检测
 * 3.如果加了，去执行方法，
 * 如果有异常，记录异常信息，并把信息输出到本地硬盘的bug.txt文件中
 * <p>
 * 效果：
 * 达到预期效果
 */
public class TestCheck {
    public static void main(String[] args) throws Exception {
        //1.创建计算器类对象
        Calculator calculator = new Calculator();
        //2.获取字节码文件对象
        Class cls = calculator.getClass();

        //3.获取所有的方法
        Method[] method = cls.getMethods();

        //将形成的异常记录信息，写到bug.txt文件中
        /* BufferedReader bw = new BufferedReader(new FileWriter("C:\Users\admin\Desktop\java-note\java\Java-middle\reflect\bug.txt"));*/
        BufferedWriter bw = new BufferedWriter(new FileWriter("C:\\Users\\admin\\Desktop\\java-note\\java\\Java-middle\\reflect\\bug.txt"));
        int count = 0;
        //遍历获取到的所有方法
        for(Method m : method){
            /**
             * 检测指定的程序Calculator这个类是否存在异常方法
             * 判断方法是否有加了注解
             */
            if(m.isAnnotationPresent(Check.class)){
                //有，执行方法
                try{
                    //没有，不执行方法
                    m.invoke(calculator );
                }catch(Exception e){
                    count++;//用来记录出现bug异常的测试的
                    bw.write(m.getName()+"方法出现异常了");
                    bw.newLine();
                    bw.write("异常名称："+e.getCause().getClass().getSimpleName());
                    bw.write("------------");
                    bw.newLine();

                }
                bw.write(" 本次测试一共出现了"+count+"个异常");
                bw.flush();
                // bw.close();
                /**
                 * 如果有异常，就捕获，并把异常信息进行记录，写到bug.txt文件中，
                 *     异常信息进行记录:
                 *        xxx方法出现异常了
                 *        异常名称：
                 *        异常原因：
                 *        --------------------
                 *        本次测试一共出现了1个异常  计数器嘛！
                 *
                 * 没有异常就正常执行
                 */

            }
        }
    }
}
